#ifndef MUCMAS_USER_INC_TETRIS_H
#define MUCMAS_USER_INC_TETRIS_H

// 参考资料:
// https://tetris.huijiwiki.com/wiki/%E4%BF%84%E7%BD%97%E6%96%AF%E6%96%B9%E5%9D%97%E5%87%86%E5%88%99
// https://blog.csdn.net/chenlong_cxy/article/details/119680671
// https://www.codeeeee.com/color/rgb.html

#include <stdint.h>

// 共7种方块, 每种方块对应一个颜色
// 为方便判断某个位置有没有方块, 规定蓝色的最低位必须为1
extern const uint8_t color [7][3];
// 每种方块的形态信息, 7种方块, 每种方块4种形态, 每种形态16个点(4*4矩阵)
extern const uint16_t form [7][4];

typedef struct{
  uint8_t outo : 1;
  // 当前方块的形态
  uint8_t form : 2;
  // 当前方块的位置， 为方块形态4*4矩阵左上角的位置
  uint8_t x    : 5;
  // 不能用无符号整型
  int8_t  y;
  // 当前方块的类型
  uint8_t type;
  // 下一个方块的类型
  uint8_t next;
  // 当前的游戏得分
  uint16_t score;
  // 游戏的难度, 即移动速度和超时时间
  uint16_t timeout;
  // 最后一次向下移动方块的时刻
  uint32_t timeMoveDown;
}Tetris_HandleTypeDef;

void Tetris_Init(void* handle, uint8_t speed);

void Tetris_InitShow(void);
void Tetris_ShowScore(void* handle);
void Tetris_ShowNext(void* handle);
// 判断指定位置是否能绘制指定图形
uint8_t Tetris_Drawable(void* handle);
// 擦去指定位置的指定图形
void Tetris_EraseBlock(void* handle);
// 在指定位置绘制指定图形
void Tetris_DrawBlock(void* handle);
// 判断是否出现新方块, 是否游戏结束, 是否得分, 并更改相应变量
void Tetris_Judge(void* handle);

void Tetris_Run(void* handle);

void Tetris_M_L(void* handle);
void Tetris_M_O(void* handle);
void Tetris_U_LJ(void* handle);
void Tetris_D_LJ(void* handle);
void Tetris_L_LJ(void* handle);
void Tetris_R_LJ(void* handle);



#endif
